package com.laolang.shop.common.core.util;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.EnumUtil;
import cn.hutool.core.util.StrUtil;
import com.github.pagehelper.PageInfo;
import com.laolang.shop.common.core.consts.GlobalConst;
import com.laolang.shop.common.core.domain.Page;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @author khlbat
 * @version 1.0
 * @date 2020/11/1 20:46
 */
public class CommonUtil {

    private CommonUtil() {
    }

    private static final String BEARER = "Bearer ";

    /* 常用正则表达式 */
    // 手机号
    public static final String REGEX_PHONE = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(17[013678])|(18[0,5-9]))\\d{8}$";

    // 密码 【同时包含字母和数字】
    public static final String REGEX_PASSWORD = "^(?![a-zA-z]+$)(?!\\d+$)(?![!@#$%^&*]+$)[a-zA-Z\\d!@#$%^&*]+$";

    /**
     * 转换 {@link PageInfo} 为 {@link Page}
     *
     * @param pageInfo {@link PageInfo} 对象
     * @param <T>      分页信息对象
     * @return 分页结果
     */
    public static <T> Page<T> pageInfo2Page(PageInfo<T> pageInfo) {
        Page<T> pageResult = new Page<>();
        pageResult.setPageNum(pageInfo.getPageNum());
        pageResult.setPageSize(pageInfo.getPageSize());
        pageResult.setSize(pageInfo.getSize());
        pageResult.setTotal(pageInfo.getTotal());
        pageResult.setPages(pageInfo.getPages());
        pageResult.setList(pageInfo.getList());
        return pageResult;
    }

    /**
     * 转换 {@link PageInfo} 为 {@link Page}
     *
     * @param pageInfo {@link PageInfo} 对象
     * @param tranform T->R 转换函数
     * @param <T>      原始分页信息对象
     * @param <R>      分页信息对象VO
     * @return 分页结果
     */
    public static <T, R> Page<R> pageInfo2Page(PageInfo<T> pageInfo, Function<T, R> tranform) {
        Page<R> pageResult = new Page<>();
        pageResult.setPageNum(pageInfo.getPageNum());
        pageResult.setPageSize(pageInfo.getPageSize());
        pageResult.setSize(pageInfo.getSize());
        pageResult.setTotal(pageInfo.getTotal());
        pageResult.setPages(pageInfo.getPages());
        pageResult.setList(CollUtil.isNotEmpty(pageInfo.getList()) ? pageInfo.getList().stream().map(tranform).collect(Collectors.toList()) : new ArrayList<>());
        return pageResult;
    }

    /**
     * 取出token的 Bearer 头
     *
     * @param token token
     * @return 无 Bearer 头的 token
     */
    public static String getTokenWithoutBearer(String token) {
        return StrUtil.startWith(token, BEARER) ? StrUtil.sub(token, 7, token.length()) : token;
    }

    /**
     * 手机号脱敏
     *
     * @param phone 原手机号
     * @return 脱敏手机号码
     */
    public static String phoneMasking(String phone) {
        return StrUtil.sub(phone, 0, 3) +
                "****" +
                StrUtil.sub(phone, 7, phone.length());
    }

    /**
     * 根据 userId 判断是否为管理员用户, 管理员账号ID暂定为 1
     *
     * @param userId 登录账号id
     * @return 是否为管理员用户
     */
    public static boolean isAdmin(Long userId) {
        return GlobalConst.ADMIN_ID.equals(userId);
    }

    /**
     * 判断常量枚举值列表中是否包含某值
     *
     * @param clazz 枚举类
     * @param value 值
     * @return boolean
     */
    public static boolean enumHasValue(Class<? extends Enum<?>> clazz, Integer value) {
        boolean has = false;
        List<Object> valueObjects = EnumUtil.getFieldValues(clazz, "value");
        for (Object valueObject : valueObjects) {
            if (Integer.parseInt(valueObject.toString()) == value) {
                has = true;
                break;
            }
        }
        return has;
    }

}
